1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 package com.sun.security.auth.module;
55
56 class Crypt {
57
58
59
60 private static final byte[] IP = {
61 58, 50, 42, 34, 26, 18, 10, 2,
62 60, 52, 44, 36, 28, 20, 12, 4,
63 62, 54, 46, 38, 30, 22, 14, 6,
64 64, 56, 48, 40, 32, 24, 16, 8,
65 57, 49, 41, 33, 25, 17, 9, 1,
66 59, 51, 43, 35, 27, 19, 11, 3,
67 61, 53, 45, 37, 29, 21, 13, 5,
68 63, 55, 47, 39, 31, 23, 15, 7,
69 };
70
71 private static final byte[] FP = {
72 40, 8, 48, 16, 56, 24, 64, 32,
73 39, 7, 47, 15, 55, 23, 63, 31,
74 38, 6, 46, 14, 54, 22, 62, 30,
75 37, 5, 45, 13, 53, 21, 61, 29,
76 36, 4, 44, 12, 52, 20, 60, 28,
77 35, 3, 43, 11, 51, 19, 59, 27,
78 34, 2, 42, 10, 50, 18, 58, 26,
79 33, 1, 41, 9, 49, 17, 57, 25,
80 };
81
82 private static final byte[] PC1_C = {
83 57, 49, 41, 33, 25, 17, 9,
84 1, 58, 50, 42, 34, 26, 18,
85 10, 2, 59, 51, 43, 35, 27,
86 19, 11, 3, 60, 52, 44, 36,
87 };
88
89 private static final byte[] PC1_D = {
90 63, 55, 47, 39, 31, 23, 15,
91 7, 62, 54, 46, 38, 30, 22,
92 14, 6, 61, 53, 45, 37, 29,
93 21, 13, 5, 28, 20, 12, 4,
94 };
95
96 private static final byte[] shifts = { 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1, };
97
98 private static final byte[] PC2_C = {
99 14, 17, 11, 24, 1, 5,
100 3, 28, 15, 6, 21, 10,
101 23, 19, 12, 4, 26, 8,
102 16, 7, 27, 20, 13, 2,
103 };
104
105 private static final byte[] PC2_D = {
106 41,52,31,37,47,55,
107 30,40,51,45,33,48,
108 44,49,39,56,34,53,
109 46,42,50,36,29,32,
110 };
111
112 private byte[] C = new byte[28];
113 private byte[] D = new byte[28];
114
115 private byte[] KS;
116
117 private byte[] E = new byte[48];
118
119 private static final byte[] e2 = {
120 32, 1, 2, 3, 4, 5,
121 4, 5, 6, 7, 8, 9,
122 8, 9,10,11,12,13,
123 12,13,14,15,16,17,
124 16,17,18,19,20,21,
125 20,21,22,23,24,25,
126 24,25,26,27,28,29,
127 28,29,30,31,32, 1,
128 };
129
130 private void setkey(byte[] key) {
131 int i, j, k;
132 byte t;
133
134 if (KS == null) {
135 KS = new byte[16*48];
136 }
137
138 for (i = 0; i < 28; i++) {
139 C[i] = key[PC1_C[i]-1];
140 D[i] = key[PC1_D[i]-1];
141 }
142 for (i = 0; i < 16; i++) {
143 for (k = 0; k < shifts[i]; k++) {
144 t = C[0];
145 for (j = 0; j < 28-1; j++)
146 C[j] = C[j+1];
147 C[27] = t;
148 t = D[0];
149 for (j = 0; j < 28-1; j++)
150 D[j] = D[j+1];
151 D[27] = t;
152 }
153 for (j = 0; j < 24; j++) {
154 int index = i * 48;
155
156 KS[index+j] = C[PC2_C[j]-1];
157 KS[index+j+24] = D[PC2_D[j]-28-1];
158 }
159 }
160 for (i = 0; i < 48; i++)
161 E[i] = e2[i];
162 }
163
164
165 private static final byte[][] S = {
166 {14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,
167 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,
168 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0,
169 15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13},
170
171 {15, 1, 8,14, 6,11, 3, 4, 9, 7, 2,13,12, 0, 5,10,
172 3,13, 4, 7,15, 2, 8,14,12, 0, 1,10, 6, 9,11, 5,
173 0,14, 7,11,10, 4,13, 1, 5, 8,12, 6, 9, 3, 2,15,
174 13, 8,10, 1, 3,15, 4, 2,11, 6, 7,12, 0, 5,14, 9},
175
176 {10, 0, 9,14, 6, 3,15, 5, 1,13,12, 7,11, 4, 2, 8,
177 13, 7, 0, 9, 3, 4, 6,10, 2, 8, 5,14,12,11,15, 1,
178 13, 6, 4, 9, 8,15, 3, 0,11, 1, 2,12, 5,10,14, 7,
179 1,10,13, 0, 6, 9, 8, 7, 4,15,14, 3,11, 5, 2,12},
180
181 {7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,
182 13, 8,11, 5, 6,15, 0, 3, 4, 7, 2,12, 1,10,14, 9,
183 10, 6, 9, 0,12,11, 7,13,15, 1, 3,14, 5, 2, 8, 4,
184 3,15, 0, 6,10, 1,13, 8, 9, 4, 5,11,12, 7, 2,14},
185
186 {2,12, 4, 1, 7,10,11, 6, 8, 5, 3,15,13, 0,14, 9,
187 14,11, 2,12, 4, 7,13, 1, 5, 0,15,10, 3, 9, 8, 6,
188 4, 2, 1,11,10,13, 7, 8,15, 9,12, 5, 6, 3, 0,14,
189 11, 8,12, 7, 1,14, 2,13, 6,15, 0, 9,10, 4, 5, 3},
190
191 {12, 1,10,15, 9, 2, 6, 8, 0,13, 3, 4,14, 7, 5,11,
192 10,15, 4, 2, 7,12, 9, 5, 6, 1,13,14, 0,11, 3, 8,
193 9,14,15, 5, 2, 8,12, 3, 7, 0, 4,10, 1,13,11, 6,
194 4, 3, 2,12, 9, 5,15,10,11,14, 1, 7, 6, 0, 8,13},
195
196 {4,11, 2,14,15, 0, 8,13, 3,12, 9, 7, 5,10, 6, 1,
197 13, 0,11, 7, 4, 9, 1,10,14, 3, 5,12, 2,15, 8, 6,
198 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 9, 2,
199 6,11,13, 8, 1, 4,10, 7, 9, 5, 0,15,14, 2, 3,12},
200
201 {13, 2, 8, 4, 6,15,11, 1,10, 9, 3,14, 5, 0,12, 7,
202 1,15,13, 8,10, 3, 7, 4,12, 5, 6,11, 0,14, 9, 2,
203 7,11, 4, 1, 9,12,14, 2, 0, 6,10,13,15, 3, 5, 8,
204 2, 1,14, 7, 4,10, 8,13,15,12, 9, 0, 3, 5, 6,11},
205 };
206
207
208 private static final byte[] P = {
209 16, 7,20,21,
210 29,12,28,17,
211 1,15,23,26,
212 5,18,31,10,
213 2, 8,24,14,
214 32,27, 3, 9,
215 19,13,30, 6,
216 22,11, 4,25,
217 };
218
219 private byte[] L = new byte[64];
220 private byte[] tempL = new byte[32];
221 private byte[] f = new byte[32];
222 private byte[] preS = new byte[48];
223
224
225 private void encrypt(byte[] block,int fake) {
226 int i;
227 int t, j, k;
228 int R = 32;
229
230 if (KS == null) {
231 KS = new byte[16*48];
232 }
233
234 for(j=0; j < 64; j++) {
235 L[j] = block[IP[j]-1];
236 }
237 for(i=0; i < 16; i++) {
238 int index = i * 48;
239
240 for(j=0; j < 32; j++) {
241 tempL[j] = L[R+j];
242 }
243 for(j=0; j < 48; j++) {
244 preS[j] = (byte) (L[R+E[j]-1] ^ KS[index+j]);
245 }
246 for(j=0; j < 8; j++) {
247 t = 6*j;
248 k = S[j][(preS[t+0]<<5)+
249 (preS[t+1]<<3)+
250 (preS[t+2]<<2)+
251 (preS[t+3]<<1)+
252 (preS[t+4]<<0)+
253 (preS[t+5]<<4)];
254 t = 4*j;
255 f[t+0] = (byte) ((k>>3)&01);
256 f[t+1] = (byte) ((k>>2)&01);
257 f[t+2] = (byte) ((k>>1)&01);
258 f[t+3] = (byte) ((k>>0)&01);
259 }
260 for(j=0; j < 32; j++) {
261 L[R+j] = (byte) (L[j] ^ f[P[j]-1]);
262 }
263 for(j=0; j < 32; j++) {
264 L[j] = tempL[j];
265 }
266 }
267 for(j=0; j < 32; j++) {
268 t = L[j];
269 L[j] = L[R+j];
270 L[R+j] = (byte)t;
271 }
272 for(j=0; j < 64; j++) {
273 block[j] = L[FP[j]-1];
274 }
275 }
276
277
278
279
280
281
282
283 public Crypt()
284 {
285
286 super();
287 }
288
289
290
291
292
293
294
295
296
297
298
299
300
301 public synchronized byte[] crypt(byte[] pw, byte[] salt) {
302 int c, i, j, pwi;
303 byte temp;
304 byte[] block = new byte[66];
305 byte[] iobuf = new byte[13];
306
307
308
309 pwi = 0;
310
311 for(i=0; pwi < pw.length && i < 64; pwi++) {
312 c = pw[pwi];
313 for(j=0; j < 7; j++, i++) {
314 block[i] = (byte) ((c>>(6-j)) & 01);
315 }
316 i++;
317 }
318
319 setkey(block);
320
321 for(i=0; i < 66; i++) {
322 block[i] = 0;
323 }
324
325 for(i=0; i < 2; i++) {
326 c = salt[i];
327 iobuf[i] = (byte)c;
328 if(c > 'Z')
329 c -= 6;
330 if(c > '9')
331 c -= 7;
332 c -= '.';
333 for(j=0; j < 6; j++) {
334 if( ((c>>j) & 01) != 0) {
335 temp = E[6*i+j];
336 E[6*i+j] = E[6*i+j+24];
337 E[6*i+j+24] = temp;
338 }
339 }
340 }
341
342 for(i=0; i < 25; i++) {
343 encrypt(block,0);
344 }
345
346 for(i=0; i < 11; i++) {
347 c = 0;
348 for(j=0; j < 6; j++) {
349 c <<= 1;
350 c |= block[6*i+j];
351 }
352 c += '.';
353 if(c > '9') {
354 c += 7;
355 }
356 if(c > 'Z') {
357 c += 6;
358 }
359 iobuf[i+2] = (byte)c;
360 }
361
362 if(iobuf[1] == 0) {
363 iobuf[1] = iobuf[0];
364 }
365
366 return(iobuf);
367 }
368
369
370
371
372
373
374
375
376
377
378
379
380 public static void main(String arg[]) {
381
382 if (arg.length!=2) {
383 System.err.println("usage: Crypt password salt");
384 System.exit(1);
385 }
386
387 Crypt c = new Crypt();
388 try {
389 byte result[] = c.crypt
390 (arg[0].getBytes("ISO-8859-1"), arg[1].getBytes("ISO-8859-1"));
391 for (int i=0; i<result.length; i++) {
392 System.out.println(" "+i+" "+(char)result[i]);
393 }
394 } catch (java.io.UnsupportedEncodingException uee) {
395
396 }
397 }
398 }